#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "MQ2.h"
#include "Motor.h"
#include "key.h"

uint8_t RxData;			//定义用于接收串口数据的变量
uint8_t KeyNum;
int8_t Speed;			//电机转速
u16 MQ2_Value;			//adc值
float temp_one;			//电压值


void Motor_str(void);

void Motor_ManualControl(void)
{

	
				//定义用于接收按键键码的变量
			
		KeyNum = Key_GetNum();				//获取按键键码
		if (KeyNum == 1)					//按键1按下
		{
			Speed += 20;					//速度变量自增20
			if (Speed > 100)				//速度变量超过100后
			{
				Speed = -100;				//速度变量变为-100
											//此操作会让电机旋转方向突然改变，可能会因供电不足而导致单片机复位
											//若出现了此现象，则应避免使用这样的操作
			}
		}
		Motor_SetSpeed(Speed);				//设置直流电机的速度为速度变量
		//OLED_ShowSignedNum(1, 7, Speed, 3);	//OLED显示速度变量
	

}
		
enum Mode  
{  
    AUTO,  
    MANUAL,  
    PLATFORM,  
    VENTILATION_ON,  
    VENTILATION_OFF  
};

enum Mode mode = MANUAL; // 初始化为手动模式  

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	
	/*显示静态字符串*/
	OLED_ShowString(2,1,"smokescope= %d ");
	OLED_ShowString(1, 1, "RxData:");
	
	
	//MQ2_Value = 60;
	/*串口初始化*/
	Serial_Init();		//串口初始化
	Motor_Init();		//电机初始化
	Adc_Init();		//模数转换初始化
	Key_Init();			//按键初始化
	MQ2_Value=Get_Adc_Average(ADC_Channel_1,10)*100/4095;//模拟烟雾浓度的值
	while (1)
	{
		if (Serial_GetRxFlag() == 1)			//检查串口接收数据的标志位
		{	
		
			RxData = Serial_GetRxData();
			switch(RxData)
			{
				case 'A'://接收字符A,为自动模式
				{
					mode = AUTO;  
					if (MQ2_Value > 20)
					Motor_SetSpeed(50);
					else  
                    {  
                        Motor_SetSpeed(0);  
                    }
					OLED_ShowString(2,1,"Mode: AUTO");  
                    OLED_ShowNum(3,1,MQ2_Value,4);
					break;
				}
				case 'B'://接收字符B，为手动模式
				{
					mode = MANUAL;  
                    Motor_ManualControl(); // 调用手动控制函数  
                    OLED_ShowString(2,1,"Mode: MANUAL");
					
					break;
				}
				
				case 'Y'://开启通风
				{
					mode = VENTILATION_ON;  
                    Motor_SetSpeed(50);  
                    OLED_ShowString(2,1,"Ventilation ON");  
                    break;
				}

				case 'N'://关闭通风
				{
					Motor_SetSpeed(0);
					break; mode = VENTILATION_OFF;  
                    Motor_SetSpeed(0);  
                    OLED_ShowString(2,1,"Ventilation OFF");  
                    break;
				}
				default:  
                {  
                    // 处理无效输入  
                    break;  
                }  
			
			}		
					//获取串口接收的数据
			MQ2_Value = Get_Adc_Average(ADC_Channel_1,10)*100/4095; 
			Serial_SendByte(RxData);			//串口将收到的数据回传回去，用于测试
				//显示串口接收的数据
			OLED_ShowNum(3,1,MQ2_Value,4);
		}
	}
}
